冬夏葵 WindowsAPI
https://scrapbox.io/files/60e302c3012213001d2bd5bf.jpg
_mainがないって言われる場合
Windows application Wizardで Desktop Application (.exe) に変更したか?
確認!!touka_aoi.icon
DirectX12の魔導書をよめ!!日本語で口語で書かれてる!!
HLSLの魔導書を読んでいたら、Winodws API をいじってウィンドウが出る仕組みを知りたくなってしまった。 HLSLの魔導書(p.25)
はやない?touka_aoi.icon
編集前だからぐちゃぐちゃなの許してくれtouka_aoi.icon
しゃあなしなヲ.icon*10
todoリスト
COM編 に行く
ここ整理する
進捗50%touka_aoi.icon
開発環境
WIndows 10 10.0.19043
基本骨子
WIndows API というか Windowsのウィンドウアプリケーションについて。
Windowsはすべてがウィンドウで構成されている
ボタンもウィンドウtouka_aoi.icon
それぞれが、メッセージを介して動いている。
windowsのエントリーポイントはwinmain
mainはwinmainとか動かすために前に処理される
winmainがwhileループしている。
機能はWindowProcが処理を行う
概念図(イメージ)
https://scrapbox.io/files/60e301748dfdb6002281d137.png
詳細
Microsoft系のプログラム構成について
hundleをポインタで受けてhundleに書いていく
C++の場合は参照渡し&
C++ の機能
文字列リテラル
LをつけるとUnicodeを表す
code:c++
string s = L"ひだりにLをつけるとUnicodeを表す"
文字列を示す "abc"、_T("abc")、L"abc" は全て意味が違う!
最後に残った L" " という文字列の表現は...ここまで読めば予想がつくだろう。そうこれはユニコード文字列を示すものだ
Windows.h の機能
winmainの引数
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
hinstance : ハンドル
hprevinstance : 意味ない
pcmdLine : コマンドライン引数
nCmdShow : ステータスコード
WinMain: アプリケーションのエントリポイント
LRSULT
windowPrcの型
32ビットの値
この返り値でwinmainが影響を受ける
あんまよくわかってないところですtouka_aoi.icon
ウィンドウプロシージャ
LRESULT 型 は、コールバック関数やウィンドウプロシージャから返される32ビットの値です
CALLBACK は WINAPI 同様に、呼び出し規約ですこの関数が返すべき値は、メッセージによって異なります
createwindowex
HWND hwnd = CreateWindowEx (0, CLASS_NAME, L"喫茶ステラと死神の蝶", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, );
HWND = hundle window
0, とりあえず0
よくわからなかったtouka_aoi.icon
CLASS_NAME
ウィンドウのクラス名
L"~~~"
ウィンドウタイトル
WS_OVERLAPPEDWINDOW
基本的なウィンドウのレイアウトを使用できる
オーバーラップウィンドウを作成します。オーバーラップウィンドウはタイトルバーと枠を持ちます。
ウィンドウスタイルは、ウィンドウの外観の一部を定義するフラグのセットです。 定数 WS _ OVERLAPPEDWINDOW は実際には複数のフラグをビットごとの or で結合したものです。 これらのフラグを組み合わせると、ウィンドウにタイトルバー、境界線、システムメニュー、 最小化 ボタンと 最大化 ボタンが表示されます。 この一連のフラグは、最上位レベルのアプリケーションウィンドウで最も一般的なスタイルです。
CW_USEDEFAULT,
ユーザー設定を引き継ぐ
メッセージ構造体を介して指示を送りあう。
code:cpp
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
MSG
イベントをキュー上にして持つ
GetMessage
MSGのキューをさばく
TranslateMessage
キーストロークを文字に翻訳する
DispatchMessage
ウィンドウプロシージャにメッセージを伝える
ウィンドウプロシージャは関数のまとまりのこと
code:cpp
PostQuitMessage(0);
イベントの一つGetmessageが受け取ると0を返す。
WndProc
ウィンドウプロシージャ
code:cpp
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
WM_CLOSE, WM_DESTROY
ウィンドウを閉じる時に呼ばれるメッセージ
概念図
https://scrapbox.io/files/613a17ec130aa300206554ea.png
WM_CLOSE
プロンプトが開く
https://scrapbox.io/files/613a1852bab0ab00226b7522.png
こんなやつ
WM_DESTORY
ウィンドウを閉じるやつ
WM_CLOSEから呼ばれる
PostQuitMessage(0)でウィンドウ破壊:D
code:destroywindow.cpp
switch(umsg)
{
case WM_CLSE {
hogehoge
}
case WM_DESTROY{
PostQuitMessage(0);
}
}
Ref
参考文献
チュートリアル: 従来の Windows デスクトップアプリケーションの作成 (C++)
環境構築は基本的にこれを読めばOKtouka_aoi.icon
Win32 と C++ の概要
実装はこっちtouka_aoi.icon
一様初期化
ウィンドウクラスについて
-- ここから未編集 --
WndProc
こいつがイベントを処理する
ディスパッチで通信する
Lpfnwndproc は、 ウィンドウプロシージャ または "window proc" と呼ばれるアプリケーション定義関数へのポインターです。 ウィンドウプロシージャは、ウィンドウのほとんどの動作を定義します。 ウィンドウの手順については、後で詳しく説明します。 ここでは、これを前方参照として扱います。
ウィンドウプロシージャ
関数のこと
左クリックしたときのイベント処理
一部のメッセージには、データが関連付けられています。 たとえば、 WM _ lbuttondown メッセージには、マウスカーソルの x 座標と y 座標が含まれています。
TranslateMessage(&msg);
DispatchMessage(&msg);
こいつがwindowプロシージャ
ここは脳死でこうしとけ
こいつがprocを起動する
DispatchMessage関数は、メッセージのターゲットであるウィンドウのウィンドウプロシージャを呼び出すようにオペレーティングシステムに指示します。 つまり、オペレーティングシステムは、ウィンドウのテーブル内のウィンドウハンドルを検索し、ウィンドウに関連付けられている関数ポインターを検索して、関数を呼び出します。
こいつが終了
PostQuitMessage(0);
WM _QUIT
プルする
wm_paintってなによtouka_aoi.icon
びょうがするときにinvokeされう
WM _ ペイント メッセージは、システムまたは別のアプリケーションがアプリケーションのウィンドウの一部の描画を要求したときに送信されます。 このメッセージは、 Updatewindow関数または redrawwindow関数が呼び出されたとき、またはアプリケーションが GetMessageまたは PeekMessage関数を使用して WM _ ペイント メッセージを取得するときに、 DispatchMessage関数によって送信されます。
windowsシステムカラー
COLROR_WINDOW に順番で指定する
これ
https://scrapbox.io/files/60e08fa214ea04001cb295eb.jpg
関数にかっこつけるのってなんでだっけ?
挙動的には初期値を設定っぽい
code:cpp
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
あとはいい感じにしといてtouka_aoi.icon ってやつ
defwindowporc
このメッセージ以外にもアプリケーション上ではさまざまなメッセージが飛び交っています。
それを全部手で書いてたら書ききれないので、ある関数に渡して自動で処理させてやります。
その関数が、DefWindowProc関数です。
この関数に、ウィンドウプロシージャの引数をそのままの順番でそのまま渡してやると、
デフォルトのウィンドウプロシージャでそのメッセージに応じた処理を自動で行ってくれます。
処理を行った後は、その処理後の終了コードを返してくるので、
ウィンドウプロシージャ内で、それを戻り値として戻してやる必要があります。
つまり、特別な処理を行いたいメッセージだけ、switch文の中に書き、
不要なものはDefWindowProc関数へ渡して処理してもらえばよい、というわけです。
やばいtouka_aoi.icon*19
windowsでた神
たのしいいいいいい
faviconとかつけたいな:D
https://scrapbox.io/files/60e09111b72cbf001cdba6fd.png
絵だしてfaviconつけたいなtouka_aoi.icon*4
わからん
ポストされたメッセージと送信メッセージの比較
場合によっては、オペレーティングシステムがウィンドウプロシージャを直接呼び出して、キューをバイパスすることがあります。
winが上から命令を出せる
アプリケーションが windows 間で通信する場合
あ?touka_aoi.icon
なんかエラーあった
warning C28251: 'WinMain' に対する整合性のない注釈: このインスタンスには 注釈なし が含まれます。
まあ別にいいらしい
_が欲しいらしいよ
次はCOMらしい
COMってなんだ...?touka_aoi.icon
コンポーネントの定義使用らしい
.NETに置き換えられているみたいな記事もあったが...?
.NETも何かわかってない(´・ω・`)
MSのランタイムっぽい印象を受けてるが...
Rustでいうcargoみたいなやつ
プロジェクトマネージャか
C#はこれよね
WNDCLASSXとWNDCLASSの違い
WNDCLASSXはcbSizeとhIconSmがある
cbSizeとは
クラスバイトサイズ?
UINT
コールバックサイズかな?
sizeof(WNDCLASSEX)が入る
hiconSM
HICONの小さいバージョン
アイコンデータ
ビットマップデータなのかな?
何の画像データかは不明
そもそも画像データなのかな...?
_T("文字列") について
UnicodeかASCⅡかを自動判別するマクロ
とりあえず文字列はこっちにしておいた方がよいらしい
L"文字列" はUnicode
undifinedとでる
windows.hの場合はTEXT()
それ以外はtchar.hで定義されている
getmoudulehandle(nullptr)
hinstance(handle)を取得する
nullptr
ヌルポインタ
RECT
四角形を定義する
AdjustWindowRect
OVERLAPPEDWINDOW
重ねられるウィンドウのこと
Windowメッセージ(ShowWIndow編)
PeekMessageとGetMessageの違い
GetMessage は、フィルター条件に一致するメッセージがキューに配置されるまで返されないのに対し、 PeekMessage は、メッセージがキューに存在するかどうかに関係なく、すぐに制御を返します。
PM_REMOVE
メッセージが処理されたらキューから削除する
わからん
libってなにtouka_aoi.icon
Preference
cbsize
hiconSM